package com.javastudy.apache.collection;

import java.util.ArrayList;  
import java.util.Collection;  
import java.util.List;  
  
import org.apache.commons.collections4.BidiMap;  
import org.apache.commons.collections4.CollectionUtils;  
import org.apache.commons.collections4.OrderedMap;  
import org.apache.commons.collections4.bidimap.TreeBidiMap;  
import org.apache.commons.collections4.map.LinkedMap; 

import org.apache.commons.collections4.IterableMap;
import org.apache.commons.collections4.MapIterator;
import org.apache.commons.collections4.map.HashedMap;
import org.junit.Test;

public class CollectionTest1 {

	/**
	 *  1.map迭代
jdk中的map接口很难进行迭代。api用户总是需要通过entryset或者keyset进行迭代。commons-collectons现在提供了一个新的接口—mapiterator来允许对maps进行简单的迭代。
	 */
	@Test
	public void testIterableMap () {
		IterableMap<String,String> iterableMap = new HashedMap<>();//注意，这个是HashedMap，apache自己提供的
	    iterableMap.put("key1", "value1");
	    iterableMap.put("key2", "value2");
        MapIterator<String, String> it = iterableMap.mapIterator();  
        while(it.hasNext()){  
          String key = it.next();  
          String value = it.getValue(); 
          System.out.println(key + "="+ value);
    //      it.setValue(newValue);  
        }  
	}

	/**
	 *  2.有序map
commons-collections为maps提供了一个新的接口，orderedmap，这个接口是有顺序的，但是并没有进行排序。linkedmap和listorderedmap(封装器)是这个接口的两种实现。这个接口支持map迭代，同时允许对map进行前向迭代和反向迭代。
	 */
	@Test
	public void testOrderedmap(){
		/** 
	      * 得到集合里按顺序存放的key之后的某一Key 
	      */  
	     OrderedMap<String, String> map = new LinkedMap<String, String>();  
	     map.put("FIVE", "5");  
	     map.put("SIX", "6");  
	     map.put("SEVEN", "7");  
	     map.firstKey(); // returns "FIVE"  
	     map.nextKey("FIVE"); // returns "SIX"  
	     map.nextKey("SIX"); // returns "SEVEN"  
	     
	     /** 
	      * BidiMap 
	      * 通过key得到value 
	      * 通过value得到key 
	      * 将map里的key和value对调 
	      */    
	     BidiMap<String, String> bidi = new TreeBidiMap<String, String>();  
	     bidi.put("SIX", "6");  
	     bidi.get("SIX");  // returns "6"  
	     bidi.getKey("6");  // returns "SIX"  
	     //       bidi.removeValue("6");  // removes the mapping  
	     BidiMap<String, String> inverse = bidi.inverseBidiMap();  // returns a map with keys and values swapped  
	     System.out.println(inverse); 
	     
	     /** 
	      * CollectionUtils.retainAll 
	      * 得到两个集合中相同的元素 
	      */  
	     List<String> list1 = new ArrayList<String>();  
	     list1.add("1");  
	     list1.add("2");  
	     list1.add("3");  
	     List<String> list2 = new ArrayList<String>();  
	     list2.add("2");  
	     list2.add("3");  
	     list2.add("5");  
	     Collection<String> c = CollectionUtils.retainAll(list1, list2);  
	     System.out.println(c);  
	}
}
